package 图.树;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;

/**
 * @author aodre , QQ : 480029069
 * @date 2023/6/10 18:59
 */
public class lc124二叉树的最大路径和 {

    private int max = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        recursion(root);
        return max;
    }

    public int recursion(TreeNode node){
        if(node == null){
//            return Integer.MIN_VALUE; // return 这个 整形最小值， 是错的， 因为会溢出， 一定要注意这一点， 你可以  MIN_VALUE / 4  MIN_VALUE / 8 都行， 不要 传个最小值， 可能有时候 会有问题
            return 0; // 返回 0 也是没有任何问题 的 只是 针对该题 而言, 对于这种题,尽量还是返回一个对结果无影响值比较好,
            // 而比较巧合的 0 对 对结果没有任何的影响!
        }
        int leftData = recursion(node.left);
        int rightData = recursion(node.right);
        int temp = leftData + rightData + node.val;
        /*
         curMax ：候选人：
            - cur 当前节点本身的值
            - cur + leftMax
            - cur + rightMax
            - cur + leftMax + rightMax
         */
//        List<Integer> integers = Arrays.asList(node.val, node.val + leftData, node.val + rightData, node.val + leftData + rightData);
        List<Integer> integers = Arrays.asList(node.val, node.val + leftData, node.val + rightData);
        int curMax = integers.stream().max((a,b) -> a - b).get();
        max = Math.max(curMax,max);
        max = Math.max(max,temp);
        return  curMax;
    }

    /*
      [2, -1] 这个节点 就过不了！ 思路有点问题
     */
    public int recursionError(TreeNode node){
        if(node == null){
            return 0;
        }
        int leftData = recursion(node.left);
        int rightData = recursion(node.right);
        int temp = leftData + rightData + node.val;
        max = Math.max(temp,max);
        return temp;
    }

    @Test
    public void test(){
        List<Integer> integers = Arrays.asList(1, 32, 10, 5);
        Integer integer = integers.stream().max((a, b) -> a - b).get();
        System.out.println(integer);
    }
}
